package com.wen.bean;

import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

/**
 * @Description:
 * @Author: wenxin
 * @Date: 2022/7/11 14:50
 * @Version: 1.0
 */
public class DigitalTextDocument extends PlainDocument {
    /***********************************************************************
     * Class： DigitalTextDocument Extends： PlainDocument
     **********************************************************************/
    private static final long serialVersionUID = 1L;
    private int maxLength;
    private int maxValue;
    private int minValue;

    // 不帯参数的构造函数
    public DigitalTextDocument() {
        super();
        maxLength = 2;
        minValue = 0;
        maxValue = 99;
    }

    // 构造函数，
    public DigitalTextDocument(int maxLength) {
        super();
        this.maxLength = maxLength;
        minValue = 0;
        maxValue = (int) Math.pow(10, maxLength) - 1;
    }

    // 构造函数，
    public DigitalTextDocument(int maxLength, int min, int max) {
        super();
        this.maxLength = maxLength;
        minValue = Math.max(min, 0);
        maxValue = Math.min(max, (int) Math.pow(10, maxLength) - 1);
    }

    // 设定最大长度
    public void setMaxLength(int length) {
        maxLength = length;
    }

    // 获取最大长度
    public int getMaxLength() {
        return maxLength;
    }

    // 设定最大值
    public void setMaxValue(int max) {
        maxValue = max;
    }

    // 获取最大值
    public int getMaxValue() {
        return maxLength;
    }

    // 设定最小值
    public void setMinValue(int min) {
        minValue = min;
    }

    // 获取最小值
    public int getMinValue() {
        return minValue;
    }

    // 重载父类的insertString函数
    @Override
    public void insertString(int offset, String str, AttributeSet a)
            throws BadLocationException {
        int valueAfterInsert = 0;
        String strBeforeInsert = getText(0, getLength());
        String strAfterInsert = strBeforeInsert.substring(0, offset) + str
                + strBeforeInsert.substring(offset);

        // 首先保证插入该字符串后，是整数；如果不是，则不进行插入操作
        try {
            valueAfterInsert = Integer.parseInt(strAfterInsert);
        } catch (NumberFormatException e) {

            return;
        }

        // 如果插入字符创str后，文档超长，则插入失败
        if (strAfterInsert.length() > maxLength) {
            return;
        }
            // 如果插入后数据超出范围，插入失败
        else if (valueAfterInsert > maxValue) {
            return;
        } else if ((strAfterInsert.length() == maxLength)
                && (valueAfterInsert < minValue)) {
            return;
        } else {
            super.insertString(offset, str, a);
            return;
        }
    }
}
